package com.itheima.reggie.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

//data 是lombok的，表示实体类不用写构造，get和set方法等

/**
 * UserDetails security的一个接口，它是提供用户信息的核心接口，该接口存储了用户的信息，后续会将对象封装到认证对象Authentication中。
 */
@Data
public class Employee implements Serializable, UserDetails {
    private static final long serialVersionUID = 1L; //序列化标识符，确保在不同编译器上反序列化的uid相等。
    private Long id;  // 用包装的long类型，包装可以防止传入null值，而long类型对应的是mybatis-plus的主键的雪花算法。
    //long类型的取值范围是19位，雪花算法生成的主键id也是19位。
    private String name;
    private String username;
    private String password;
    private String sex;
    private String idNumber;
    private Long phone;
    private Integer status;
    //在添加员工时，使用mp的自动填充功能，进行填充
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTable;
    //添加时候要自定填充，更新时候也要自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime uptateTable;
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    //这是员工角色认证，多表查询的时候一个表收不完。
    @TableField(exist = false)
    private List<Role> roleList = new ArrayList<>();

    //绑定账号的角色是什么
    //该方法返回用户的角色是什么，返回用户的权限，这个集合用户控制用户的访问，也就是Authentication
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> list = new ArrayList<>();
        //遍历员工角色，将其添加到GrantedAuthority的集合，之后才能用此检查用户的权限。
        //role 里面的name是employee的用户名，keyword就是就这个用户名设置一个角色，后续用此检查用户的权限。
        roleList.forEach(r -> {
            list.add(new SimpleGrantedAuthority(r.getKeyword()));
        });
        return list;
    }

    //是否没有过期
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    //是否没有被锁定
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    //认证信息是否没有过期
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
